home *** CD-ROM | disk | FTP | other *** search
/ TPUG - Toronto PET Users Group / TPUG Users Group CD / TPUG Users Group CD.iso / AMIGA / (A)Z / (A)Z11.ADF / LOGO / LOGOSOURCE / proplist.c < prev    next >
C/C++ Source or Header  |  1987-06-29  |  4KB  |  179 lines

  1.  
  2. /* Property list primitives */
  3.  
  4. #include "logo.h"
  5.  
  6. #ifndef SMALL
  7.  
  8. struct property {
  9.     char *prname;
  10.     struct object *prvalue;
  11.     struct property *prnext;
  12. };
  13.  
  14. struct proplist {
  15.     char *plname;
  16.     struct property *props;
  17.     struct proplist *plnext;
  18. } *allprops = NULL;
  19.  
  20. struct proplist *findplist(var)
  21. char *var;
  22. {
  23.     register struct proplist *plp;
  24.  
  25.     for (plp=allprops; plp; plp=plp->plnext)
  26.         if (!strcmp(var,plp->plname)) return(plp);
  27.     return(0);
  28. }
  29.  
  30. struct property *findprop(prp,name)
  31. register struct property *prp;
  32. char *name;
  33. {
  34.     for (; prp; prp=prp->prnext)
  35.         if (!strcmp(name,prp->prname)) return(prp);
  36.     return(0);
  37. }
  38.  
  39. pprop(name,prop,object)
  40. struct object *name,*prop,*object;
  41. {
  42.     char *nstr;
  43.     register struct proplist *plp;
  44.     register struct property *prp,*prp1;
  45.  
  46.     if (!stringp(name)) ungood("Pprop",name);
  47.     if (!stringp(prop)) ungood("Pprop",prop);
  48.     if ((plp=findplist(token(name->obstr)))==0) {
  49.         plp=(struct proplist *)ckmalloc(sizeof(struct proplist));
  50.         nstr = ckmalloc(1+strlen(name->obstr));
  51.         strcpy(nstr,token(name->obstr));
  52.         plp->plname = nstr;
  53.         plp->props = 0;
  54.         plp->plnext = allprops;
  55.         allprops = plp;
  56.     }
  57.     prp = plp->props;
  58.     if (prp1 = findprop(prp,prop->obstr)) {
  59.         lfree(prp1->prvalue);
  60.     } else {
  61.         prp1 = (struct property *)ckmalloc(sizeof(struct property));
  62.         nstr = ckmalloc(1+strlen(prop->obstr));
  63.         strcpy(nstr,token(prop->obstr));
  64.         prp1->prname = nstr;
  65.         prp1->prnext = prp;
  66.         plp->props = prp1;
  67.     }
  68.     prp1->prvalue = globcopy(object);
  69.     mfree(name);
  70.     mfree(prop);
  71.     mfree(object);
  72. }
  73.  
  74. remprop(name,prop)
  75. struct object *name,*prop;
  76. {
  77.     register struct proplist *plp;
  78.     register struct property *prp,*prp1;
  79.  
  80.     if (!stringp(name)) ungood("Remprop",name);
  81.     if (!stringp(prop)) ungood("Remprop",prop);
  82.     if ((plp=findplist(token(name->obstr)))==0) {
  83.         pf1("%p has no properties\n",name);
  84.         errhand();
  85.     }
  86.     prp = plp->props;
  87.     for (prp1=0; prp; prp=prp->prnext) {
  88.         if (!strcmp(prp->prname,token(prop->obstr))) {
  89.             if (prp1)
  90.                 prp1->prnext = prp->prnext;
  91.             else
  92.                 plp->props = prp->prnext;
  93.             JFREE(prp->prname);
  94.             lfree(prp->prvalue);
  95.             JFREE(prp);
  96.             break;
  97.         }
  98.         prp1 = prp;
  99.     }
  100.     if (prp == 0) {
  101.         pf1("%p has no %p property.\n",name,prop);
  102.         errhand();
  103.     }
  104.     mfree(name);
  105.     mfree(prop);
  106. }
  107.  
  108. struct object *gprop(name,prop)
  109. struct object *name,*prop;
  110. {
  111.     register struct proplist *plp;
  112.     register struct property *prp,*prp1;
  113.  
  114.     if (!stringp(name)) ungood("Gprop",name);
  115.     if (!stringp(prop)) ungood("Gprop",prop);
  116.     if ((plp=findplist(token(name->obstr)))==0) {
  117.         mfree(name);
  118.         mfree(prop);
  119.         return(0);
  120.     }
  121.     prp = plp->props;
  122.     if (prp1 = findprop(prp,token(prop->obstr))) {
  123.         mfree(name);
  124.         mfree(prop);
  125.         return(localize(prp1->prvalue));
  126.     } else {
  127.         mfree(name);
  128.         mfree(prop);
  129.         return(0);
  130.     }
  131. }
  132.  
  133. pps() {
  134.     register struct proplist *plp;
  135.     register struct property *prp;
  136.     register char *name;
  137.  
  138.     for (plp=allprops; plp; plp=plp->plnext) {
  139.         name = plp->plname;
  140.         for (prp=plp->props; prp; prp=prp->prnext) {
  141.             pf1("%s's %s is %p\n",name,prp->prname,prp->prvalue);
  142.         }
  143.     }
  144. }
  145.  
  146. struct object *plist(name)
  147. struct object *name;
  148. {
  149.     register struct proplist *plp;
  150.     register struct property *prp;
  151.     register struct object *tail;
  152.     struct object *head;
  153.  
  154.     if (!stringp(name)) ungood("Plist",name);
  155.     if ((plp=findplist(token(name->obstr)))==0) {
  156.         mfree(name);
  157.         return(0);
  158.     }
  159.     if ((prp = plp->props)==0) {
  160.         mfree(name);
  161.         return(0);
  162.     }
  163.     head = tail = globcons(0,0);
  164.     for (; prp; prp=prp->prnext) {
  165.         tail->obcar = globcopy(objcpstr(prp->prname));
  166.         tail->obcdr = globcopy(globcons(0,0));
  167.         tail = tail->obcdr;
  168.         tail->obcar = globcopy(prp->prvalue);
  169.         if (prp->prnext) tail->obcdr = globcopy(globcons(0,0));
  170.         else tail->obcdr = 0;
  171.         tail = tail->obcdr;
  172.     }
  173.     mfree(name);
  174.     return(localize(head));
  175. }
  176.  
  177. #endif
  178.  
  179.